perm filename HAL.PAL[HAL,HE]3 blob sn#155544 filedate 1975-04-24 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00003 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	.TITLE  AL INTERPRETER
C00004 00003	 program initialization
C00014 ENDMK
C⊗;
.TITLE  AL INTERPRETER

	.MACRO SYSDEF ADR, CONTEN
	III == .
	. = ADR
	CONTEN
	. = III
	.ENDM

.INSRT KDEF.PAL[11,SYS]
.INSRT HALHED.PAL[HAL,HE]
.INSRT HALIO.PAL[HAL,HE]
.INSRT LARGEB.PAL[HAL,HE]
;INSRT GRAPHS.PAL[HAL,HE]
;INSRT FBUG.PAL[1,BES]
;INSRT ARITH.PAL[HAL,HE]
.INSRT INTERP.PAL[HAL,HE]
INSTRT = 44000

;Data areas
ARG1:	.BLKW 32.	;Long enough for a trans
ARG2:	.BLKW 32.	;Long enough for a trans
RES:	.BLKW 32.	;Long enough for a trans
	.BLKW 100	;Stack
STACK:	.BLKW 1		;
	TELL ISBS
ISTBLK:	.BLKW ISBS	;Interpreter status block
ENVIRO:	.BLKW 100	;Environment
INSTCK:	.BLKW INSTSZ	;Interpreter Stack

	PDBLK MAINBL,100,S	;Makes a process descriptor for main process

	SYSDEF JOBDAT, MAINBL
	SYSDEF JOBSA, START
	SYSDEF JOBPDL, STACK
; program initialization
	PDBSTA	== 40	;Process Descriptor Block Status Word
	PDBR0	== 60	;Where R0 is saved
	PDBR1	== 62	;Where R1 is saved
	PDBR2	== 64	;Where R2 is saved
	PDBR3	== 66	;Where R3 is saved
	PDBR4	== 70	;Where R4 is saved
	PDBR5	== 72	;Where R5 is saved
	PDBSP	== 74	;Where SP is saved
	PDBPC	== 76	;Where PC is saved
	PDBSSV	== 104	;Process Descriptor Block Stack Save Length Word
START:	
	MOV #16,R0	;Field length
	MOV #10,R1	;Decimal digits
	JSR PC,FORMAT	;
	MOV #STACK,R3	;Set up argument stack
	JSR PC,FRINIT	;Initialize free storage

	EVMAK		;-(SP) ← event
	MOV #ISBS,R0	;R0 ← Size (in words) of an interpreter status block
	JSR PC,GTFREE	;R0 ← LOC[new interpreter status block]
	CLR LEV(R0)	;new LEV ← 0
	MOV #INSTRT,IPC(R0)	;new IPC ← interpreter start address
	MOV #ENVIRO,ENV(R0)	;new ENV ← ENVIRO
	MOV (SP),EVT(R0);new EVT ← event just created.
	MOV R0,-(SP)	;Save LOC[new interpreter status block]
	MOV #INSTSZ,R0	;R0 ← Size needed for an interpreter stack
	JSR PC,GTFREE	;R0 ← LOC[new interpreter stack]
	MOV (SP)+,R1	;R1 ← LOC[new interpreter status block]
	MOV R0,STKBAS(R1)	;Store away new stack base
	ADD #2*INSTSZ,R0	;R0 ← LOC[top of new stack] (INSTSZ is in bytes)
	MOV R1,-(SP)	;Save R1
	MOV R0,-(SP)	;Save R0
	MOV #210,R0	;Room for process descriptor
	JSR PC,GTFREE	;R0 ← LOC[new process descriptor]
	MOV #UFPUSE+UGPSAV,PDBSTA(R0);Use floating point, use saved registers.
	MOV #100,PDBSSV(R0)	;Length of stack to be saved.
	MOV (SP)+,R1	;R1 ← LOC[new interpreter stack top]
	MOV R1,PDBR3(R0)	;Store away new interp stack pointer (reg 3)
	MOV (SP)+,R1		;R1 ← LOC[new ISB]
	MOV R0,PCB(R1)		;Store away LOC[PCB] in new ISB
	MOV R1,PDBR4(R0)	;Store away LOC[ISB] in reg 4 of PCB
	MOV SP,R1	;
	TST (R1)+	;
	MOV R1,PDBSP(R0)	;Store away the new stack pointer (reg 6)
	MOV #INTERP,PDBPC(R0);Store away the new PC
	ADD #PDBSTA,R0	;Move R0 to the middle of the process descriptor
	SCHEDU R0,#INTERP,#0,#2;Cause the new process to be started, suspended
	EVWAIT (SP)	;Wait for the return signal
	BCC  TST1	;All well?
	HALERR TSTMES	;No
TST1:	OUTSTR TSTME1	;Say farewell
	DISMIS		;Go away
TSTMES: ASCIE </BAD RETURN FROM MAIN INTERPRETER
/>
TSTME1: ASCIE </
ALL DONE NOW.  SEE YOU AROUND!
/>

PATCH:  .BLKW 100

.END START